package com.lanou3g.redis;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.hash.ObjectHashMapper;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 封装了Redis常用操作API
 */
@Component
public class RedisClient {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

/**************************** redis 简单类型 start***************************/

    /**
     * 设置一个简单类型的key、value
     *
     * @param key
     * @param value
     */
    public void set(String key, Object value) {
        redisTemplate.opsForValue().set(key, value);
    }

    /**
     * 获取简单类型的key\value
     *
     * @param key
     * @return
     */
    public Object get(String key) {
        return redisTemplate.opsForValue().get(key);
    }

/**************************** redis 简单类型 end***************************/


/**************************** redis Hash start***************************/

    /**
     * 设置一个Hash类型的value
     *
     * @param key
     * @param value
     */
    public void setHash(String key, Object value) {
        Map<byte[], byte[]> hashValue = new ObjectHashMapper().toHash(value);
        redisTemplate.opsForHash().putAll(key, hashValue);
    }

    /**
     * 获取Hash类型value
     *
     * @param key
     * @return
     */
    public Object getHash(String key) {
        HashOperations<String, byte[], byte[]> hashOperations = redisTemplate.opsForHash();
        Map<byte[], byte[]> hashValue = hashOperations.entries(key);
        return new ObjectHashMapper().fromHash(hashValue);
    }

/**************************** redis Hash end***************************/


/**************************** redis 列表list start***************************/

    /**
     * 在列表(list)头插入指定元素(一个key可以对应多个value)
     *
     * @param key
     * @param value
     */
    public void insert2List(String key, Object value) {
        redisTemplate.opsForList().leftPush(key, value);
    }

    /**
     * 在列表(list)后追加指定元素(一个key可以对应多个value)
     *
     * @param key
     * @param value
     */
    public void add2List(String key, Object value) {
        redisTemplate.opsForList().rightPush(key, value);
    }

    /**
     * 获取列表(list)里key对应的下标为index的value(一个key可以对应多个value)
     *
     * @param key
     * @param idx
     * @return
     */
    public Object getList(String key, int idx) {
        return redisTemplate.opsForList().index(key,idx);
    }

    /**
     * 获取列表(list)里一个key对应的多个value(一个key可以对应多个value)
     *
     * @param key
     * @param startIndex
     * @param endIndex
     * @return
     */
    public List<Object> getList(String key, int startIndex, int endIndex) {
        return redisTemplate.opsForList().range(key, startIndex, endIndex);
    }

    /**
     * 获取列表(list)里key对应的value的数量(一个key可以对应多个value)
     *
     * @param key
     * @return
     */
    public long listSize(String key) {
        return redisTemplate.opsForList().size(key);
    }

/**************************** redis 列表list end***************************/


/**************************** redis 集合Set start***************************/

    /**
     * 向集合(set:无序集合)添加一个或多个成员，返回添加成功的数量
     * @param key
     * @param values
     * @return
     */
    public long sAdd(String key,Object... values){
        return redisTemplate.opsForSet().add(key,values);
    }

    /**
     * 获取集合(set:无序集合)的成员数
     * @param key
     * @return
     */
    public long sCard(String key){
        return redisTemplate.opsForSet().size(key);
    }

    /**
     * 返回集合(set:无序集合)中的所有成员
     * @param key
     * @return
     */
    public Set<Object> sMembers(String key){
        return redisTemplate.opsForSet().members(key);
    }

    /**
     * 判断value元素是否是集合(set:无序集合)key的成员
     * @param key
     * @param value
     * @return 在集合中返回true, 不在则返回false
     */
    public  boolean sIsMember(String key,Object value){
        return redisTemplate.opsForSet().isMember(key,value);
    }

/**************************** redis 集合Set end***************************/


/**************************** redis 有序集合Sorted set start***************************/

    public long zAdd(String key,Object value){
        return 0;
    }

/**************************** redis 有序集合Sorted set end***************************/
}
